"""
模型配置模块
专门用于研究助理的模型配置，与业务配置分离
"""

from typing import Optional
from langchain_openai import ChatOpenAI
from src.config.research_settings import research_settings, ResearchSettings
from pydantic import SecretStr

# 显式指定类型以帮助IDE进行类型检查
typed_research_settings: ResearchSettings = research_settings


def get_llm() -> ChatOpenAI:
    """
    获取配置好的LLM实例
    
    Returns:
        ChatOpenAI: 配置好的OpenAI聊天模型实例
    """
    # 检查是否启用模拟模式
    if typed_research_settings.is_simulation_mode():
        from langchain_community.llms import FakeListLLM
        responses = [
            "根据搜索策略，我将为您提供关于问题的详细分析。",
            "网络搜索结果:\n1. 相关信息点1\n2. 相关信息点2\n\n知识图谱信息:\n主题 --关联--> 相关主题\n相关主题 --属性--> 属性值",
            "sufficient",
            "基于全面的分析，问题的主要要点包括：1）关键点1；2）关键点2；3）关键点3。"
        ]
        return FakeListLLM(responses=responses)
    
    return ChatOpenAI(
        base_url=typed_research_settings.OPENAI_API_BASE,
        api_key=SecretStr(typed_research_settings.OPENAI_API_KEY),
        model=typed_research_settings.OPENAI_MODEL,
        temperature=typed_research_settings.OPENAI_TEMPERATURE,
        max_completion_tokens=typed_research_settings.OPENAI_MAX_TOKENS,
    )


def get_llm_with_config(
    model: Optional[str] = None,
    temperature: Optional[float] = None,
    max_tokens: Optional[int] = None
) -> ChatOpenAI:
    """
    获取带有自定义配置的LLM实例
    
    Args:
        model: 模型名称，如果为None则使用默认配置
        temperature: 温度参数，如果为None则使用默认配置
        max_tokens: 最大令牌数，如果为None则使用默认配置
        
    Returns:
        ChatOpenAI: 配置好的OpenAI聊天模型实例
    """
    # 检查是否启用模拟模式
    if typed_research_settings.is_simulation_mode():
        from langchain_community.llms import FakeListLLM
        responses = [
            "根据搜索策略，我将为您提供关于问题的详细分析。",
            "网络搜索结果:\n1. 相关信息点1\n2. 相关信息点2\n\n知识图谱信息:\n主题 --关联--> 相关主题\n相关主题 --属性--> 属性值",
            "sufficient",
            "基于全面的分析，问题的主要要点包括：1）关键点1；2）关键点2；3）关键点3。"
        ]
        return FakeListLLM(responses=responses)
    
    return ChatOpenAI(
        model=model or typed_research_settings.OPENAI_MODEL,
        temperature=temperature or typed_research_settings.OPENAI_TEMPERATURE,
        max_completion_tokens=max_tokens or typed_research_settings.OPENAI_MAX_TOKENS,
        base_url=typed_research_settings.OPENAI_API_BASE,
        api_key=SecretStr(typed_research_settings.OPENAI_API_KEY),
    )